# -*- coding:utf-8 -*-
"""
@Author : 审心
@Time : 2023/5/4 13:51
相关分析缓存操作
"""
from typing import List, Dict, Union

import pandas as pd
from pandas import DataFrame
from common.logger.log import log_
from autoTask.taobao.redis_key_mange import RedisKey
from common.redis import redis_client
from common.utils import DateUtil

key_prefix = RedisKey.sycm.xgfx.key_word_list.key


def build_key(search_key: str, date_cycle: str):
    return key_prefix + date_cycle + f":{search_key}"


def put_cache(search_key: str, date_cycle: str, result_list: list, key_index: int = 0,
              ex: int = DateUtil.seconds_until_end_of_day(1)):
    """
    添加缓存
    :param search_key: 搜索的关键词
    :param date_cycle: 时间周期
    :param result_list: 搜索结果列表
    :param key_index: 关键词列 索引 下标
    :param ex: 过期时间 默认当前时间到今天结束的时间距离 秒数
    :return:
    """
    key = build_key(search_key, date_cycle)
    for item in result_list:
        redis_client.h_set_put(key, item[key_index], item, ex=ex)


def put_cache_by_df(search_key: str, date_cycle: str, df: DataFrame,
                    ex: int = DateUtil.seconds_until_end_of_day(1)):
    """
    通过解析好的 DataFrame 添加缓存
    :param search_key: str
    :param date_cycle: 数据周期
    :param df: 页面的 csv 解析后的数据
    :param ex: 过期时间 默认当前时间到今天结束的时间距离 秒数
    :return:
    """
    key = build_key(search_key, date_cycle)
    log_.info(key)
    put_df_head_cache(df)
    for item in df.values.tolist():
        redis_client.h_set_put(key, item[0], item, ex=ex)


def get_all(date_cycle: str) -> Dict[str, List]:
    """
    获取所有缓存
    :return: key: 关键词名称 value: 关键词数据
    """
    keys = redis_client.keys(build_key("*", date_cycle))
    dict_ = {}
    for key in keys:
        result_list = redis_client.h_set_get(key, key_type=str, value_type=list)
        for item in result_list:
            dict_.update(item)
    return dict_


def get_one(category_name: str, date_cycle: str):
    """
    获取指定分类的一条数据d
    :param date_cycle: 数据时间周期
    :param category_name: 分类名称
    :return:
    """
    return get_all(date_cycle).get(category_name)


def get_search_key_list(search_key: str, date_cycle: str) -> list:
    """
    获取搜索词的结果列表
    :param date_cycle: 数据时间周期
    :param search_key: 搜索用的关键词
    :return:这个搜索词列表
    """
    dict_list = redis_client.h_set_get(build_key(search_key, date_cycle), key_type=str, value_type=list)
    result = []
    for item in dict_list:
        result.extend(item.values())
    return result


def put_df_head_cache(df: DataFrame, ex: int = DateUtil.seconds_until_end_of_day(1)):
    """
    通过解析好的 DataFrame表头 添加缓存
    :param key: redis key
    :param df: 页面的 csv 解析后的数据
    :param ex: 过期时间 默认当前时间到今天结束的时间距离 秒数
    :return:
    """
    item = df.columns.tolist()
    redis_client.h_set_put(key_prefix + '表头', 'head', item, ex=ex)


def get_search_key_df(search_key: str, date_cycle: str) -> Union[pd.DataFrame, None]:
    """
    获取搜索词的结果列表
    :param date_cycle: 数据时间周期
    :param search_key: 搜索用的关键词
    :return:这个搜索词列表
    """
    df_head_list = redis_client.h_set_get(key_prefix + '表头', key_type=str, value_type=list)
    dict_list = redis_client.h_set_get(build_key(search_key, date_cycle), key_type=str, value_type=list)
    result = []
    if not df_head_list and dict_list:
        raise Exception('表头不存在')
    elif not df_head_list or not dict_list:
        return None
    df_head = df_head_list[-1].get('head')
    for item in dict_list:
        result.extend(item.values())
    if result:
        df = pd.DataFrame(result, columns=df_head)
        return df

    return None
